package com.tarena.servlet;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import com.tarena.dao.FilesDao;
import com.tarena.domain.Files;

/**
 * 
 * 
 * @author Wangpeihu
 * @team [Never give up]
 * @since JDK1.6(建议)
 * @date 2010-2-2
 */
public class UploadActionServlet extends HttpServlet {

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		try {
			request.setCharacterEncoding("utf-8");
			response.setContentType("text/html;charset=utf-8");
			PrintWriter out = response.getWriter();

			// 该对象可以用于控制性能方面的参数，比如说，指定缓存，
			DiskFileItemFactory dfif = new DiskFileItemFactory();

			// 这个很重要，查看API时重点看这个，他封装了上传数据的获取方法。这是个apache提供的jar包
			// 这个对象在工作的时候要用到上面的DiskFileItemFactory
			ServletFileUpload upload = new ServletFileUpload(dfif);

			// 设置文件上传文件的大小单位是字节。可以上传512M的文件
			upload.setSizeMax(1024 * 1024 * 512);

			// 解析request，参数是request，让upload去解析他。返回List对象
			List<?> list = upload.parseRequest(request);

			// 将这个request提交上来的每个对像(文件)装在map集合中，以便后面的按Key，取value，方便使用
			Map<String, FileItem> map = new HashMap<String, FileItem>();
			for (int i = 0; i < list.size(); i++) {
				FileItem item = (FileItem) list.get(i);
				map.put(item.getFieldName(), item);
			}

			// 对方穿过来的标记名就是:file,这是我们提前知道的。所以在map集合里能找到.
			FileItem file = map.get("file");
			String name = file.getName();

			// 得到扩展名
			name = name.substring(name.lastIndexOf("."));

			// 将文件名改为自己定义的有规则的文件名，以便处理
			String fileName = String.valueOf(System.currentTimeMillis() + name);

			Files files = new Files();
			String dir = "upload";

			files.setPath(dir);

			ServletContext ctx = getServletContext();
			System.out.println(dir + "地址现象");
			// 文件的保存地址
			dir = ctx.getRealPath(dir);
			File uploadFile = new File(dir, fileName);

			FileItem desc = map.get("desc");
			String description = desc.getString();
			// 将文件上传到指定的文件夹中
			file.write(uploadFile);

			// 开始处理将文件的信息写入数据库
			files.setName(fileName);
			files.setDescription(description);
			// System.out.println("path:"+files.getPath()+
			// "name:"+files.getName()+
			// "description:"+files.getDescription());
			new FilesDao().insertFile(files);
			// out.println("<html>");
			// out.println("<head>" +
			// "<title>Infomation...</title>" +
			// "</head>");
			// out.println("<body>");
			// out.println("<h1>上传成功</h1>");
			// out.println("<a href='html/first.html' style='font-color=red'>继续上传</a>");
			// out.println("<a href='SeePicServlet' style='font-color=red'>查看图片</a>");
			// out.println("</body>");
			// out.println("</html>");
			//			
			// outputRedirct.

			response.sendRedirect("SeePicServlet");

			/*
			 * //用来封装上传文件的信息 FileItem fileItem = (FileItem)list.get(0);
			 * 
			 * 
			 * //获得文件的名称(如果传的(如果是非文件，返回之是null)
			 * System.out.println(fileItem.getName());
			 * 
			 * //获得对应的表单name值 System.out.println(fileItem.getFieldName());
			 * 
			 * //false表示为文件，true是通常的表单
			 * System.out.println(fileItem.isFormField());
			 * 
			 * //提交的内容（字符串形式），如果是文件，这句话没有意义
			 * System.out.println(fileItem.getString());
			 * 
			 * //通过这个输入流，可以获得文件的 FileOutputStream os = new
			 * FileOutputStream(fileItem.getName()); InputStream is =
			 * fileItem.getInputStream();
			 * 
			 * IOUtils.copy(is, os); is.close(); os.close();
			 */
		} catch (Exception e) {
			throw new ServletException(e);
		}
	}

}
